home *** CD-ROM | disk | FTP | other *** search
- (*******************************************************************************
- :Program. Intro.MOD
- :Author. Carsten Wartmann
- :Address. Wutzkyallee 83, D-1000 Berlin 47
- :Phone. 030/6614776
- :Version. 1.5
- :Date. 4/89
- :Copyright. PD
- :Language. Modula-2
- :Compiler. M2Amiga V3.2d
- :Contents. Demo of Sprites, Copper, Scrolltext in Modula-2
- *******************************************************************************)
-
- (* For more infos see Intro.DOC *)
-
- MODULE Intro ; (* $R- $V- $S- *) (* Achtung ! Vor Änderungen entfernen ! *)
-
-
- FROM SYSTEM IMPORT BITSET,ADR,FFP,ADDRESS,INLINE,SHIFT ;
-
- FROM Arts IMPORT Assert ;
-
- FROM Intuition IMPORT NewScreen,ScreenPtr,OpenScreen,CloseScreen,
- customScreen,NewWindow,WindowPtr,SetPointer,
- IDCMPFlags,IDCMPFlagSet,WindowFlags,WindowFlagSet,
- OpenWindow,CloseWindow,RethinkDisplay ;
-
- FROM Graphics IMPORT ViewModes,ViewModeSet,SetAPen,RastPortPtr,ClearScreen,
- LoadRGB4,Move,RastPort,WritePixel,Draw,GetSprite,
- FreeSprite,MoveSprite,SimpleSpritePtr,UCopList,
- Text,RectFill,BltBitMap,ScrollRaster,ReadPixel ;
-
- FROM GfxMacros IMPORT CINIT,CMOVE,CWAIT,CEND ;
-
- FROM Exec IMPORT AllocMem,FreeMem,MemReqs,MemReqSet,CopyMem,
- Forbid,Permit ;
-
- FROM MathLibFFP IMPORT sin,cos,pi ;
-
- FROM Str IMPORT Concat ;
-
-
- CONST Punkte = 720 ;
- Punkte1 = 720.0 ; (*Is` ne` Krücke*)
-
- TYPE SpriteStruc = RECORD
- SpriteData : ADDRESS ;
- height : INTEGER ;
- xpos : INTEGER ;
- ypos : INTEGER ;
- num : INTEGER ;
- END ;
-
-
- VAR screen : NewScreen ;
- screenptr : ScreenPtr ;
- window : NewWindow ;
- windowptr : WindowPtr ;
- drawRP : RastPortPtr ;
- viewP,ucopl,fbitmap,
- mousemem : ADDRESS ;
- cia[0BFE000H] : BITSET ;
- fehler,t,i,ii,sprite,
- charnr,row : INTEGER ;
- cx,cy : ARRAY [0..Punkte] OF INTEGER ;
- chipmem,data : ADDRESS ;
- spritess : ARRAY [0..7] OF SpriteStruc ;
- stext,stext1 : ARRAY [0..150] OF CHAR ;
-
-
- PROCEDURE Sprite ; (*$E-*)
-
- BEGIN (* Spritedaten, müssen noch ins CHIP-RAM ! *)
- (* für jedes Sprite einzeln auch bei gleichem Aussehen ! *)
-
- INLINE (
- 00000H,00000H, (*Startworte mit X,Y etc... *)
- 004C0H,003C0H,018B0H,007F0H,03B18H,007F8H,078F4H,007FCH,
- 077B8H,008FCH,0FACAH,005FEH,0C244H,03DFEH,0F206H,00DFEH,
- 0E27EH,01DFEH,0F58CH,00AFEH,0764CH,009BCH,07AC0H,0053CH,
- 03E70H,00198H,01FC0H,00030H,007C0H,00000H,00000H,00000H,
- 00000H,00000H, (*Stopworte für Sprite-DMA...*)
- 00000H,00000H,
- 004C0H,003C0H,018B0H,007F0H,03B18H,007F8H,078F4H,007FCH,
- 077B8H,008FCH,0FACAH,005FEH,0C244H,03DFEH,0F206H,00DFEH,
- 0E27EH,01DFEH,0F58CH,00AFEH,0764CH,009BCH,07AC0H,0053CH,
- 03E70H,00198H,01FC0H,00030H,007C0H,00000H,00000H,00000H,
- 00000H,00000H,
- 00000H,00000H,
- 004C0H,003C0H,018B0H,007F0H,03B18H,007F8H,078F4H,007FCH,
- 077B8H,008FCH,0FACAH,005FEH,0C244H,03DFEH,0F206H,00DFEH,
- 0E27EH,01DFEH,0F58CH,00AFEH,0764CH,009BCH,07AC0H,0053CH,
- 03E70H,00198H,01FC0H,00030H,007C0H,00000H,00000H,00000H,
- 00000H,00000H,
- 00000H,00000H,
- 004C0H,003C0H,018B0H,007F0H,03B18H,007F8H,078F4H,007FCH,
- 077B8H,008FCH,0FACAH,005FEH,0C244H,03DFEH,0F206H,00DFEH,
- 0E27EH,01DFEH,0F58CH,00AFEH,0764CH,009BCH,07AC0H,0053CH,
- 03E70H,00198H,01FC0H,00030H,007C0H,00000H,00000H,00000H,
- 00000H,00000H,
- 00000H,00000H,
- 004C0H,003C0H,018B0H,007F0H,03B18H,007F8H,078F4H,007FCH,
- 077B8H,008FCH,0FACAH,005FEH,0C244H,03DFEH,0F206H,00DFEH,
- 0E27EH,01DFEH,0F58CH,00AFEH,0764CH,009BCH,07AC0H,0053CH,
- 03E70H,00198H,01FC0H,00030H,007C0H,00000H,00000H,00000H,
- 00000H,00000H,
- 00000H,00000H,
- 004C0H,003C0H,018B0H,007F0H,03B18H,007F8H,078F4H,007FCH,
- 077B8H,008FCH,0FACAH,005FEH,0C244H,03DFEH,0F206H,00DFEH,
- 0E27EH,01DFEH,0F58CH,00AFEH,0764CH,009BCH,07AC0H,0053CH,
- 03E70H,00198H,01FC0H,00030H,007C0H,00000H,00000H,00000H,
- 00000H,00000H
- ) ;
-
- END Sprite ;
-
- PROCEDURE RGB ; (*$E-*)
-
- BEGIN (* Farbwerte fuer die Sprites *)
-
- INLINE(0000H,0000H,03F0H,05D0H,07B0H,0990H,0B70H,0D50H,
- 0F30H,0000H,0000H,0000H,0000H,0000H,0000H,0000H,
- 0000H,0000H,0000H,0000H,0000H,0002H,0006H,000BH,
- 0000H,0004H,0008H,000DH,0000H,0006H,000AH,000FH)
-
- END RGB ;
-
- PROCEDURE MakeUCopL ;
-
- VAR i,spr0pth,spr0ptl : INTEGER ;
-
- BEGIN (* Errechnen der User-Copper-Liste *)
-
- (* Die CL sorgt auch dafür, daß der Mauszeiger ausgeschaltet *)
- (* wird, denn mit SetPointer funktioniert mit einer UCL zusammen *)
- (* nicht ! Durch die CL wird immer wieder der alte Wert gelesen *)
- spr0pth := INTEGER(SHIFT(mousemem,-8)) ;
- spr0ptl := INTEGER(SHIFT(SHIFT(mousemem,8),-8)) ;
-
- CMOVE(ucopl,0120H,spr0pth) ; (* Ausschalten des Mauszeigers *)
- CMOVE(ucopl,0122H,spr0pth) ;
-
- FOR i := 0 TO 255 DO
-
- CWAIT(ucopl,i,14) ;
- CMOVE(ucopl,0DFF180H,i*8+i*4+i*2+i) ;
-
- END (*FOR*) ;
-
- CEND(ucopl,254,255) ; (* Unsinniger Befehl zeigt das Ende d. CL *)
-
- screenptr^.viewPort.uCopIns := ucopl ;
-
- RethinkDisplay() ;
-
- END MakeUCopL ;
-
-
- PROCEDURE OpenAll ;
-
- BEGIN (* Öffnen des Screens, Windows und Alloziieren des Speichers *)
-
- WITH screen DO
-
- leftEdge := 0 ;
- topEdge := 0 ;
- width := 640 ;
- height := 256 ;
- depth := 2 ;
- viewModes := ViewModeSet{sprites,hires} ;
- type := customScreen ;
- font := NIL ;
- defaultTitle := NIL ;
- gadgets := NIL ;
- customBitMap := NIL ;
-
- END (*WITH*) ;
-
- screenptr := OpenScreen(screen) ;
- Assert(screenptr # NIL,ADR("Screen is nix")) ;
-
- WITH window DO
-
- leftEdge := 0 ;
- topEdge := 0 ;
- width := 640 ;
- height := 256 ;
- detailPen := 0 ;
- blockPen := 1 ;
- idcmpFlags := IDCMPFlagSet{} ;
- flags := WindowFlagSet{borderless} ;
- firstGadget := NIL ;
- checkMark := NIL ;
- title := NIL ;
- screen := screenptr ;
- bitMap := NIL ;
- type := customScreen ;
-
- END (*WITH*) ;
-
- windowptr := OpenWindow(window) ;
- Assert(windowptr # NIL,ADR("Window is nix")) ;
-
- drawRP := windowptr^.rPort ;
- viewP := ADR(screenptr^.viewPort) ;
-
- chipmem := AllocMem(512,MemReqSet{chip,memClear}) ;
- Assert(chipmem # NIL,ADR("No ChipMem for Sprites aviable !")) ;
-
- (* ACHTUNG ! Das Mem für die UCopList darf nicht wieder *)
- (* freigegeben werden, das macht das System, sonst GURU (81...9) *)
- ucopl := AllocMem(SIZE(UCopList),MemReqSet{chip,memClear}) ;
- Assert(ucopl # NIL,ADR("No ChipMem for UCopL aviable !")) ;
-
- mousemem := AllocMem(16,MemReqSet{chip,memClear}) ;
- Assert(mousemem # NIL,ADR("No ChipMem for NILPointer aviable !")) ;
-
- LoadRGB4(viewP,ADR(RGB),32) ; (* Einlesen der Farbwerte *)
-
- CopyMem(ADR(Sprite),chipmem,72*6) ; (*Kopieren der Grafik ins CHIP *)
-
- FOR sprite := 2 TO 7 DO (* Initialisieren der Sprites *)
-
- WITH spritess[sprite] DO
-
- data := chipmem ;
- INC(data,72*(sprite-2)) ;
-
- SpriteData := data ;
- height := 16 ;
- xpos := 0 ;
- ypos := 0 ;
- num := sprite ;
-
- END (*WITH*) ;
-
- i := GetSprite(ADR(spritess[sprite]),sprite) ;
-
- END (*FOR sprite*) ;
-
- MakeUCopL ;
-
- END OpenAll ;
-
-
- PROCEDURE PlotCourse ;
-
- VAR x,y,rad : FFP ;
- xbild,ybild,
- winkel,fehler : INTEGER ;
-
-
- BEGIN (* Errechnen des Kurses *)
-
- FOR winkel := 0 TO Punkte DO
-
- rad := (FFP(winkel)) / (Punkte1/360.0) * pi / 180.0 ;
-
- x := sin(4.0*rad) ; (* Lissajous-Figur ! *)
- y := cos(5.0*rad) ;
-
- xbild := 320 + TRUNC(x * 290.0) ;
- ybild := 120 - TRUNC(y * 110.0) ;
-
- (*fehler := WritePixel(drawRP,xbild,ybild) ;*)
- (*Kommentar entfernen, wenn der Kurs gezeichnet werden soll*)
-
- cx[winkel] := xbild - 4 ;
- cy[winkel] := ybild - 4 ;
-
- END (*FOR winkel*) ;
-
- END PlotCourse ;
-
-
- PROCEDURE CopyRow(row : INTEGER) ;
-
- VAR y,dummy : INTEGER ;
-
- BEGIN (* Ich hatte leider Probleme mit BltBitMap...*)
-
- FOR y := 0 TO 7 DO
-
- SetAPen(drawRP,ReadPixel(drawRP,row,y)) ;
- RectFill(drawRP,636,110+y*4,640,114+y*4) ;
-
- END (*FOR*) ;
-
- END CopyRow ;
-
-
- BEGIN (* Hauptprogramm *)
-
- stext := "Hi, this is a Scrolltext....So what ?...Not for a cracked game," ;
- stext1 := " only a Modula-2 demo of using sprites, copper and scrolling..." ;
-
- Concat(stext,stext1) ; (* Fügt die Texte zu einem String zuasammen *)
-
- OpenAll ;
-
- PlotCourse ;
-
- Forbid() ; (* Sorgt fuer einen flüssigen Ablauf *)
-
- LOOP (* Hauptschleife *)
-
- FOR i := 0 TO Punkte DO
-
- FOR sprite := 2 TO 7 DO (* Alle Sprites setzen *)
-
- ii := (i + (sprite-1) * 5) MOD Punkte ;
-
- MoveSprite(viewP,ADR(spritess[sprite]),cx[ii],cy[ii]) ;
-
- END (*FOR sprite*) ;
-
- (* Ab hier beginnt die Textdarstellung (siehe DOC) *)
-
- SetAPen(drawRP,1) ;
- Move(drawRP,0,6) ;
- Text(drawRP,ADR(stext[charnr]),1) ;
-
- CopyRow(row) ;
- ScrollRaster(drawRP,4,0,0,110,640,150) ;
-
- INC(row) ;
-
- IF row>7 THEN
- INC(charnr) ;
- IF charnr>125 THEN
- charnr := 0 ;
- END (*IF*) ;
- row := 0 ;
- END (*IF*) ;
-
- IF NOT(6 IN cia) THEN (* Solange bis linker Mausknopf gerdrückt *)
- EXIT ;
- END (*IF*) ;
-
- END (*FOR i*) ;
-
- END (*WHILE*) ;
-
- Permit() ; (* Multitasking ein und die Resourcen zurückgeben *)
-
- CloseWindow(windowptr) ;
- CloseScreen(screenptr) ;
-
- FOR i := 2 TO 7 DO
-
- FreeSprite(i) ;
-
- END (*FOR i*) ;
-
- FreeMem(chipmem,512) ;
- FreeMem(mousemem,16) ;
-
- END Intro .
-